//
//  main.m
//  02-ClassAndObject
//
//  Created by 曹曹 on 16/7/5.
//  Copyright © 2016年 曹曹. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Fraction.h"
int main(int argc, const char * argv[]) {
    
    // 1.快捷键
    // command 0 开/收起左边的栏
    // command option 0 开/收起右边的栏
    // command shift Y 开/收下边的栏
    // command B 编译
    // command R 运行
    // command C 复制
    // command V 粘贴
    // command Z 撤销
    // command N 新建文件
    // command shift N 新建工程
    // command shift Z 反撤销
    
    // control F 光标右移一位
    // control B 光标左移一位
    // control ← 切换到左边屏幕
    // control → 切换到右边屏幕
    // control N 光标移到下一行
    // control P 光标移到上一行
    
    // 2.移动光标
    // command ← 到行首
    // command → 到行末
    // command ↑ 第一行
    // command ↓ 最后行
    
    // 3.选中文字
    // shift ← 选中左边一个字
    // shift → 选中右边一个字
    // shift ↑ 选中从当前位置开始到上一行对应的位置
    // shift ↓ 选中从当前位置开始到下一行对应的位置
    
    // command shift ← 选中光标开始左边所有的文字
    // command shift → 选中光标开始右边所有的文字
    // command shift ↑ 选中光标开始上边所有的文子
    // command shift ↓ 选中光标开始下边所有的文字
    
    // 1.类和对象
    // 类: 一个具有相同行为和特征的事物抽象集合
    // 对象: 类的实例, 也称作类的实现
    // 面向对象的思想, 万物皆对象,
    // 面向对象语言是面向对象思想的具体体现
    // OOP 面向对象编程 Object Oriented Programming
    // OOD 面向对象设计
    // 面向对象三大特性: 封装, 继承, 多态. 目的是提高代码的复用
    
    // 2.Objective-C(OC)
    // 与C语言的区别
    // OC属于C语言的扩展
    // OC有类的概念
    // OC中声明属性和方法在.h文件中
    // OC中方法的具体实现在.m文件中
    // .mm 是C++的文件, 在这个文件里可以编写C++代码
    
    // OC中的根类: NSObject
    
    // 3.创建OC的实例
    // 1> 消息语法 [object doSomething];
    // 像object对象发送一个doSomething的方法,让他去调用
    // 类方法调用(由类名去调用)
    // + alloc 开辟内存空间
    NSObject *objc = [NSObject alloc];
    // 实例方法调用
    // - init
    NSObject *newObjec = [objc init];
    // 创建一个Person对象
    Person *per = [[Person alloc] init];
    // 公开的成员可以通过->直接赋值, 取值
    per->_age = 24;
    NSLog(@"%ld", per->_age);
    [per sleep:2];
    // 受保护的成员不能通过->直接访问,通过setter和getter来访问.
    [per setName:@"张三"];
    
    // id 与 instancetype
    // instancetype作为返回值参数时与id是一样的,系统编译器会把id类型转成instancetype(即当前对象类型)
    // id 可以作为变量类型来使用, 但instancetype不行
    id obj = [[NSObject alloc] init];
    
    Fraction *frac1 = [Fraction fractionWithNumerator:1 denominator:2];
    Fraction *frac2 = [Fraction fractionWithNumerator:3 denominator:4];
    Fraction *frac3 = [Fraction fractionWithNumerator:3 denominator:57];
    
    Fraction *plus = [frac1 plusWithFraction:frac2];
    Fraction *decrease = [frac1 decreaseWithFraction:frac2];
    Fraction *multiple = [frac1 multipleWithFraction:frac2];
    Fraction *divide = [frac1 divideWithFraction:frac2];
    Fraction *reduction = [frac3 reduction];
    
    if (plus.demoninator == 0 || decrease.demoninator == 0 || multiple.demoninator == 0 || divide.demoninator == 0) {
        NSLog(@"分母不能为0");
    } else {
        NSLog(@"plus:%ld/%ld", plus.numerator, plus.demoninator);
        NSLog(@"decrease:%ld/%ld", decrease.numerator, decrease.demoninator);
        NSLog(@"multiple:%ld/%ld", multiple.numerator, multiple.demoninator);
        NSLog(@"divide:%ld/%ld", divide.numerator, divide.demoninator);
        NSLog(@"reduction:%ld/%ld", reduction.numerator, reduction.demoninator);
    }
    
    [frac1 compareWithFraction:frac2];
    
    return 0;
}
